/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package br.com.foxinline.servico;

import br.com.foxinline.modelo.Pessoa;
import br.com.foxinline.modelo.Protocolo;
import br.com.foxinline.modelo.Usuario;
import br.com.foxinline.util.Caracter;
import br.com.foxinline.util.Msg;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import javax.ejb.EJB;
import javax.ejb.Stateless;
import javax.persistence.NoResultException;
import javax.persistence.NonUniqueResultException;
import javax.persistence.Query;

/**
 *
 * @author laverson
 */
@Stateless
public class ProtocoloServico extends ServicoGenerico<Protocolo> {

    @EJB
    PessoaServico clienteServico;
    @EJB
    UsuarioServico usuarioServico;
    @EJB
    SecretariaServico secretariaServico;

    public ProtocoloServico() {
        super(Protocolo.class);
    }

    @Override
    public void salvar(Protocolo entity) {
        entity.setDataCadastro(new Date());
        entity.setUsuario(usuarioServico.getCurrentUser());

        String numeroProtocolo = entity.getNumero() + new SimpleDateFormat("yyyy").format(entity.getDataProtocolo());
        
        entity.setNumero(Integer.parseInt(numeroProtocolo));
        
        Pessoa cliente = entity.getCliente();

        if (cliente != null && cliente.getId() == null) {
            clienteServico.salvar(cliente);
            entity.setCliente(cliente);
        }

        super.salvar(entity);
    }

    public List<Protocolo> pesquisar(Protocolo protocolo) {
        String sql = "Select p from Protocolo p";

        Pessoa cliente = protocolo.getCliente();
        cliente.setCpf(Caracter.removecaracter(cliente.getCpf()));
        cliente.setCnpj(Caracter.removecaracter(cliente.getCnpj()));

        if ((cliente.getNome() != null && !cliente.getNome().equals(""))
                || (cliente.getCpf() != null && !cliente.getCpf().equals(""))
                || (cliente.getRg() != null && !cliente.getRg().equals(""))
                || (cliente.getNomeFantasia() != null && !cliente.getNomeFantasia().equals(""))
                || (cliente.getCnpj() != null && !cliente.getCnpj().equals(""))) {
            sql += " JOIN p.cliente c ";
        }

        sql += " where ";

        if (protocolo.getNumero() != null) {
            sql += " p.numero = :numero AND ";
        }
        if (protocolo.getDataProtocolo() != null) {
            sql += " p.dataProtocolo = :dataProtocolo AND ";
        }

        if (cliente.getNome() != null && !cliente.getNome().equals("")) {
            cliente.setNome(cliente.getNome().replace(" ", "%"));
            sql += " lower(c.nome) LIKE lower(:nome) AND ";
        }
        if (cliente.getCpf() != null && !cliente.getCpf().equals("")) {
            sql += " lower(c.cpf) LIKE lower(:cpf) AND ";
        }
        if (cliente.getRg() != null && !cliente.getRg().equals("")) {
            sql += " lower(c.rg) LIKE lower(:rg) AND ";
        }
        if (cliente.getNomeFantasia() != null && !cliente.getNomeFantasia().equals("")) {
            cliente.setNomeFantasia(cliente.getNomeFantasia().replace(" ", "%"));
            sql += " lower(c.nomeFantasia) LIKE lower(:nomeFantasia) AND ";
        }
        if (cliente.getCnpj() != null && !cliente.getCnpj().equals("")) {
            sql += " lower(c.cnpj) LIKE lower(:cnpj) AND ";
        }
        sql += " 1=1 ";

        Query query = getEntityManager().createQuery(sql);

        if (protocolo.getNumero() != null) {
            query.setParameter("numero", protocolo.getNumero());
        }
        if (protocolo.getDataProtocolo() != null) {
            query.setParameter("dataProtocolo", protocolo.getDataProtocolo());
        }

        if (cliente.getNome() != null && !cliente.getNome().equals("")) {
            query.setParameter("nome", "%" + cliente.getNome() + "%");
        }
        if (cliente.getCpf() != null && !cliente.getCpf().equals("")) {
            query.setParameter("cpf", cliente.getCpf());
        }
        if (cliente.getRg() != null && !cliente.getRg().equals("")) {
            query.setParameter("rg", cliente.getRg());
        }
        if (cliente.getNomeFantasia() != null && !cliente.getNomeFantasia().equals("")) {
            query.setParameter("nomeFantasia", "%" + cliente.getNomeFantasia() + "%");
        }
        if (cliente.getCnpj() != null && !cliente.getCnpj().equals("")) {
            query.setParameter("cnpj", cliente.getCnpj());
        }

        return query.getResultList();
    }

    public List<Protocolo> pesquisarProtocoloArquivo(Protocolo protocolo) {
        String sql = "Select p from Protocolo p JOIN p.etiqueta e ";

        Pessoa cliente = protocolo.getCliente();
        cliente.setCpf(Caracter.removecaracter(cliente.getCpf()));
        cliente.setCnpj(Caracter.removecaracter(cliente.getCnpj()));

        if ((cliente.getNome() != null && !cliente.getNome().equals(""))
                || (cliente.getCpf() != null && !cliente.getCpf().equals(""))
                || (cliente.getRg() != null && !cliente.getRg().equals(""))
                || (cliente.getNomeFantasia() != null && !cliente.getNomeFantasia().equals(""))
                || (cliente.getCnpj() != null && !cliente.getCnpj().equals(""))) {
            sql += " JOIN p.cliente c ";
        }

        sql += " where ";

        if (protocolo.getNumero() != null) {
            sql += " p.numero = :numero AND ";
        }
        if (protocolo.getDataProtocolo() != null) {
            sql += " p.dataProtocolo = :dataProtocolo AND ";
        }

        if (protocolo.getEtiqueta() != null) {
            if (protocolo.getEtiqueta().getEstante() != null && !protocolo.getEtiqueta().getEstante().equals("")) {
                sql += " e.estante = :estante AND ";
            }
            if (protocolo.getEtiqueta().getNumCaixa() != null) {
                sql += " e.numCaixa = :caixa AND ";
            }
            if (protocolo.getEtiqueta().getPratileira() != null && !protocolo.getEtiqueta().getPratileira().equals("")) {
                sql += " e.pratileira = :pratileira AND ";
            }
        }

        if (cliente.getNome() != null && !cliente.getNome().equals("")) {
            cliente.setNome(cliente.getNome().replace(" ", "%"));
            sql += " lower(c.nome) LIKE lower(:nome) AND ";
        }
        if (cliente.getCpf() != null && !cliente.getCpf().equals("")) {
            sql += " lower(c.cpf) LIKE lower(:cpf) AND ";
        }
        if (cliente.getRg() != null && !cliente.getRg().equals("")) {
            sql += " lower(c.rg) LIKE lower(:rg) AND ";
        }
        if (cliente.getNomeFantasia() != null && !cliente.getNomeFantasia().equals("")) {
            cliente.setNomeFantasia(cliente.getNomeFantasia().replace(" ", "%"));
            sql += " lower(c.nomeFantasia) LIKE lower(:nomeFantasia) AND ";
        }
        if (cliente.getCnpj() != null && !cliente.getCnpj().equals("")) {
            sql += " lower(c.cnpj) LIKE lower(:cnpj) AND ";
        }
        sql += " 1=1  ";

        Query query = getEntityManager().createQuery(sql);

        if (protocolo.getNumero() != null) {
            query.setParameter("numero", protocolo.getNumero());
        }
        if (protocolo.getDataProtocolo() != null) {
            query.setParameter("dataProtocolo", protocolo.getDataProtocolo());
        }

        if (protocolo.getEtiqueta() != null) {
            if (protocolo.getEtiqueta().getEstante() != null && !protocolo.getEtiqueta().getEstante().equals("")) {
                query.setParameter("estante", protocolo.getEtiqueta().getEstante());
            }
            if (protocolo.getEtiqueta().getNumCaixa() != null) {
                query.setParameter("caixa", protocolo.getEtiqueta().getNumCaixa());
            }
            if (protocolo.getEtiqueta().getPratileira() != null && !protocolo.getEtiqueta().getPratileira().equals("")) {
                query.setParameter("pratileira", protocolo.getEtiqueta().getPratileira());
            }
        }

        if (cliente.getNome() != null && !cliente.getNome().equals("")) {
            query.setParameter("nome", "%" + cliente.getNome() + "%");
        }
        if (cliente.getCpf() != null && !cliente.getCpf().equals("")) {
            query.setParameter("cpf", cliente.getCpf());
        }
        if (cliente.getRg() != null && !cliente.getRg().equals("")) {
            query.setParameter("rg", cliente.getRg());
        }
        if (cliente.getNomeFantasia() != null && !cliente.getNomeFantasia().equals("")) {
            query.setParameter("nomeFantasia", "%" + cliente.getNomeFantasia() + "%");
        }
        if (cliente.getCnpj() != null && !cliente.getCnpj().equals("")) {
            query.setParameter("cnpj", cliente.getCnpj());
        }

        return query.getResultList();
    }

    public List<Protocolo> pesquisarRelProtocolo(Date dataIni, Date dataFim) {
        String sql = "Select Distinct(p) from Protocolo p ";

        if (dataIni != null || dataFim != null) {
            sql += " JOIN p.processos s ";
        }

        sql += " where ";

        if ((dataIni != null) && (dataFim == null)) {
            sql += " s.dataProcesso = :dataIni AND ";
        }

        if (dataFim != null && dataIni == null) {
            sql += " s.dataProcesso = :dataFim AND ";
        }

        if (dataIni != null && dataFim != null) {
            sql += " s.dataProcesso  BETWEEN  :dataIni AND  :dataFim AND  ";
        }


        sql += " 1=1 group by p";

        Query query = getEntityManager().createQuery(sql);

        if ((dataIni != null) && (dataFim == null)) {
            query.setParameter("dataIni", dataIni);
        }
        if ((dataFim != null) && (dataIni == null)) {
            query.setParameter("dataFim", dataFim);
        }

        if (dataIni != null && !dataIni.equals("") && dataFim != null && !dataFim.equals("")) {
            query.setParameter("dataIni", dataIni);
            query.setParameter("dataFim", dataFim);
        }


        return query.getResultList();
    }

    public Protocolo existProtocolo(Integer num) {
        Protocolo protocolo;
        String sql = "Select p from Protocolo p where p.numero = :num";
        Query query = getEntityManager().createQuery(sql);
        query.setParameter("num", num);
        try {
            protocolo = (Protocolo) query.getResultList().get(0);

        } catch (NoResultException nr) {
            return null;
        } catch (NonUniqueResultException nre) {
            return null;
        } catch (Exception e) {
            return null;
        }

        return protocolo;
    }

    /**
     * Pesquisa por todos os protocolos que foram enviados/ou não para o usuário
     * atual do sistema. Caso a a consulta não necessite de protocolo, o valor
     * null deve ser informado
     *
     * @param protocolo contendo numero e dataProtocolo setados para pesquisa
     * @param recebido true/false para pesquisar pelos protocolos recebidos ou
     * não recebidos, respectivamente
     * @return lista de protocolos filtrados pelos parametros informados
     */
    public List<Protocolo> protocolosRecebidos(Protocolo protocolo, boolean recebido) {
        Usuario usuario = usuarioServico.getCurrentUser();

//        if (usuario != null) {
        if (usuario.getSetor() != null) {

            String sql = "SELECT p FROM Protocolo p JOIN p.tramites t JOIN t.secretaria s "
                    + "WHERE s.id = :secretariaID AND ";

            if (protocolo != null) {
                if (protocolo.getNumero() != null) {
                    sql += "p.numero = :numero AND ";
                }
                if (protocolo.getDataProtocolo() != null) {
                    sql += "p.dataProtocolo = :data AND ";
                }
            }

            if (recebido) {
                sql += "t.recebido = :true AND ";
            } else {
                sql += "(t.recebido = :false OR t.recebido = :null) AND ";
            }

            sql += "1 = 1";
            System.err.println(sql);

            Query query = getEntityManager().createQuery(sql);

            query.setParameter("secretariaID", secretariaServico.find(usuario.getSetor()).getId());

            if (protocolo != null) {
                if (protocolo.getNumero() != null) {
                    query.setParameter("numero", protocolo.getNumero());
                }
                if (protocolo.getDataProtocolo() != null) {
                    query.setParameter("data", protocolo.getDataProtocolo());
                }
            }

            if (recebido) {
                query.setParameter("true", true);
            } else {
                query.setParameter("false", false);
                query.setParameter("null", null);
            }

            return query.getResultList();
//            }
        }

        return new ArrayList<Protocolo>();
    }
}
